﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace osDinamicMemory
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var memory = new FakeMemory(8);
            var allocated = new List<int>();
            while (true)
            {
                Console.WriteLine();
                Console.WriteLine("1) Выделение памяти.");
                Console.WriteLine("2) Очищение ранее выделенного участка.");
                Console.WriteLine("3) Вывод информации о занятых блоках.");
                Console.WriteLine("4) Вывод информации о свободных блоках.");
                Console.WriteLine("5) Вывод общей информации о памяти.");
                Console.WriteLine("6) Вывод битовой карты на экран.");
                string operation = Console.ReadLine();
                switch (operation)
                {
                    case "1":
                        {
                            Console.Clear();
                            Console.WriteLine("Введите количество памяти, которое необходиом выделить.");
                            int numb = Convert.ToInt32(Console.ReadLine());
                            int location = memory.MemoryAllocation(numb);

                            if (location != -1)
                            {
                                allocated.Add(location);
                                Console.WriteLine("Успешно.");
                            }
                            else
                            {
                                Console.WriteLine("Ошибка.");
                            }
                        }
                        break;
                    case "2":
                        {
                            Console.Clear();
                            if (allocated.Count != 0)
                            {
                                Console.WriteLine("Введите номер выделенного участка.");
                                int j = 1;
                                allocated.Sort();
                                foreach (var i in allocated)
                                {
                                    Console.WriteLine("{0}) Начало блока {1}", j, i);
                                    j++;
                                }
                                int num = Convert.ToInt32(Console.ReadLine());
                                memory.CleanupMemory(allocated[num - 1]);
                                allocated.RemoveAt(num - 1);
                                Console.WriteLine("Успешно.");
                            }
                            else
                            {
                                Console.WriteLine("Размещенных блоков нет.");
                            }
                        }
                        break;
                    case "3":
                        {
                            Console.Clear();
                            GetSectionsInfo(memory, false);
                        }
                        break;
                    case "4":
                        {
                            Console.Clear();
                            GetSectionsInfo(memory, true);
                        }
                        break;
                    case "5":
                        {
                            Console.Clear();
                            int allocatedSize = memory.GetFullSections().Sum(p => p.Size);
                            int emptySize = memory.GetEmptySections().Sum(p => p.Size);
                            Console.WriteLine("Всего занято: {0}", allocatedSize);
                            Console.WriteLine("Всего свободно: {0}", emptySize);
                        }
                        break;
                    case "6":
                        {
                            Console.Clear();
                            Console.WriteLine("Битовая карта.");
                            foreach (var b in memory.bitmap)
                            {
                                Console.Write(b ? "1":"0");
                            }
                            Console.WriteLine();
                        }
                        break;
                }
            }
        }

        private static void GetSectionsInfo(FakeMemory op, bool EmptyOrFull)
        {
            Console.WriteLine();
            var list = new List<Sections>();
            list = EmptyOrFull ? op.GetEmptySections() : op.GetFullSections();
            Console.WriteLine(EmptyOrFull ? "Пустые блоки." : "Занятые блоки.");
            if (list.Count == 0)
            {
                Console.WriteLine("Блоков нет.");
                return;
            }
            foreach (var sectionse in list)
            {
                Console.WriteLine("Начальный адрес: {0} Размер: {1}", sectionse.Allocation, sectionse.Size);
            }     
        }
    }
}
